// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

package store

import (
	"io"
	"os"

	"github.com/kumose/kmopt/pkg/repository/v1manifest"
)

// Store represents the storage level
type Store interface {
	Begin() (FsTxn, error)
}

// FsTxn represent the transaction session of file operations
type FsTxn interface {
	Write(filename string, reader io.Reader) error
	Read(filename string) (io.ReadCloser, error)
	WriteManifest(filename string, manifest *v1manifest.Manifest) error
	ReadManifest(filename string, role v1manifest.ValidManifest) (*v1manifest.Manifest, error)
	Stat(filename string) (os.FileInfo, error)
	// ResetManifest should reset the manifest state
	ResetManifest() error
	Commit() error
	Rollback() error
}

// New returns a Store, currently only qcloud supported
func New(root string, upstream string) Store {
	return newLocalStore(root, upstream)
}
